package classLoader;

/**
 * @author Jamie Nie
 * @title: TestDynamicLoad
 * @projectName jvm-exercise
 * @Slogan: The harder you work, the more luck you have.
 * @date 2021/6/19 0019 23:24
 * @description: 加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载
 * 加载：在硬盘上查找并通过IO读入字节码文件，使用到类时才会加载，例如调用类的
 *      main()方法，new对象等等，在加载阶段会在内存中生成一个代表这个类的
 *      java.lang.Class对象，作为方法区这个类的各种数据的访问入口
 * 验证：校验字节码文件的正确性
 * 准备：给类的静态变量分配内存，并赋予默认值
 * 解析：将符号引用替换为直接引用，该阶段会把一些静态方法(符号引用，比如
 *      main()方法)替换为指向数据所存内存的指针或句柄等(直接引用)，这是所谓的静态链接过
 *      程(类加载期间完成)，动态链接是在程序运行期间完成的将符号引用替换为直接引用
 * 初始化：对类的静态变量初始化为指定的值，执行静态代码块
 */
public class TestDynamicLoad {
    static {
        System.out.println("-------load TestDynamicLoad------");
    }
    public static void main(String[] args) {
        new A();
        System.out.println("--------load Test--------");
        B b = null;//B不会加载，除非执行了new B();
    }
}

class A{
    static {
        System.out.println("--------load A--------");
    }

    public A() {
        System.out.println("--------initial A--------");
    }
}

class B{
    static {
        System.out.println("-------load B-------");
    }

    public B() {
        System.out.println("---------initial B---------");
    }
}
